{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 一.原理\n",
    "HBOS(Histogram-based Outlier Score)算法，即基于直方图的异常点检测算法，笔者在最近的工作中恰好有用到该算法，实践中的表现效果很nice，它的原理简单来说就是就是将数据各维度的直方图概率相加，整体概率值越小的样本，它是异常点的可能性就越高，衡量指标定义如下：   \n",
    "\n",
    "$$\n",
    "HBOS(p)=\\sum_{i=1}^dlog(\\frac{1}{hist_i(p)})\n",
    "$$  \n",
    "\n",
    "这里，$hist_i(p)$表示样本$p$在第$i$维特征上的直方图概率，借助于numpy，我们可以轻易实现该算法"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 二.代码实现"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "#造伪数据\n",
    "from sklearn.datasets import make_classification\n",
    "X, _ = make_classification(n_samples=5000, n_features=2,\n",
    "                           n_informative=2,n_redundant=0,\n",
    "                           n_repeated=0, n_classes=3,\n",
    "                           n_clusters_per_class=1,weights=[0.01, 0.05, 0.94],\n",
    "                           class_sep=0.8, random_state=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x1cfa387b860>"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(x=X[:,0],y=X[:,1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "#计算直方图概率\n",
    "hist_X=np.zeros_like(X)\n",
    "for i in range(0,X.shape[1]):\n",
    "    hist,bins=np.histogram(X[:,i])\n",
    "    hist=hist/hist.sum()\n",
    "    hist_X[:,i]=np.asarray([hist[idx-1] for idx in np.digitize(X[:,i],bins[:-1])])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.3086, 0.3084],\n",
       "       [0.0888, 0.1024],\n",
       "       [0.2284, 0.3084],\n",
       "       ...,\n",
       "       [0.3086, 0.3084],\n",
       "       [0.2284, 0.3084],\n",
       "       [0.1058, 0.0804]])"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "hist_X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "#计算HBOS异常值\n",
    "hbos=np.zeros_like(hist_X[:,0])\n",
    "for i in range(0,hist_X.shape[1]):\n",
    "    hbos+=np.log(1.0/(hist_X[:,i]+1e-7))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([2.35206633, 4.70023509, 2.65301368, ..., 2.35206633, 2.65301368,\n",
       "       4.76694367])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "hbos"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "#定义异常阈值\n",
    "thresh=0.01#前1%\n",
    "thresh_value=sorted(hbos)[int(len(hbos)*(1-thresh))]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x1cfa391e9e8>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#查看异常值\n",
    "plt.scatter(x=X[:,0],y=X[:,1],c=hbos>=thresh_value)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "代码封装到ml_models.outlier_detect包中..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
